package com.future;

/**
 * Description:
 * 给你一个整数数组 nums ，你需要找出一个 连续子数组 ，如果对这个子数组进行升序排序，那么整个数组都会变为升序排序。
 * 请你找出符合题意的 最短 子数组，并输出它的长度。
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/shortest-unsorted-continuous-subarray
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 *
 * @Author: future
 * @Date:2022/2/28:23:50
 */
public class Solution_findUnsortedSubarray_581 {

    public static void main(String[] args) {
        int[] nums = {2, 6, 4, 8, 10, 9, 15};
        nums = new int[]{1, 2, 3, 4};

        System.out.println(findUnsortedSubarray(nums));
    }

    /**
     * 1、第一个遍历
     * 从左边开始，依次从左到右是否是递增，记录最大值，遇到小于的记录下标，最终会记录到最右小于最大值得下标
     * 2第二个遍历
     * 从右边开始，依次从右到左看是否递减，记录最小值，遇到比最小值还大的，就记录下标，最终会记录到最左侧满足条件的下标
     *
     * @param nums
     * @return
     */
    public static int findUnsortedSubarray(int[] nums) {
        if (nums == null || nums.length < 2) {
            return 0;
        }
        int length = nums.length;
        // 1、
        int righLess = -1;
        int preMaxVal = nums[0];
        for (int i = 1; i < length; i++) {
            if (nums[i] < preMaxVal) {
                righLess = i;
            }
            preMaxVal = Math.max(preMaxVal, nums[i]);
        }
        // 2.
        int leftMax = -1;
        int tailMinVal = nums[length - 1];
        for (int i = length - 2; i >= 0; i--) {
            if (nums[i] > tailMinVal) {
                leftMax = i;
            }
            tailMinVal = Math.min(tailMinVal, nums[i]);
        }
        return righLess == -1 ? 0 : righLess - leftMax + 1;
    }


}
